//
//  UITextView+Emoticon.swift
//  Emoticon_Keyboard
//
//  Created by 杨振 on 15/10/20.
//  Copyright © 2015年 杨振. All rights reserved.
//

import UIKit

extension UITextView {

    // 注意：如果在循环引用的闭包中调用函数，尽管函数中不用出现 `self`，但是仍然会出现循环引用
    // 1. 控制器持有 键盘控制器
    // 2. 键盘控制器持有 闭包
    // 3. 闭包对控制器进行强引用
    func insertEmoticon(emoticon: Emoticon) {
        
        // 1. emoji 本质上就是一个字符串，可以直接在网络中传输
        if emoticon.emoji != nil {
            replaceRange(selectedTextRange!, withText: emoticon.emoji!)
            return
        }
        // 2.插入表情图片 -> 实例化一个属性文本对象
        //              -> 使用自定义属性记录：表情文字的属性字符串
        //              -> 使用自己的属性记录：表情文字的图片
        let attachment = EmoticonAttachment()
        attachment.chs = emoticon.chs
        attachment.image = UIImage(contentsOfFile: emoticon.imagePath)
        
        let h = font!.lineHeight
        print("线高\(h)")
        // 提示：在 scrollView 中，bounds 的原点 就是 contentOffset
        attachment.bounds = CGRect(x: 0, y: -4, width: h, height: h)
        let imageText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
        
        
        // 3.保存文本字体属性
        //   name: 属性的名称
        //   value: 属性值
        imageText.addAttribute(NSFontAttributeName, value: font!, range: NSMakeRange(0, 1))
        
        // 4. 图片文字插入到 textView
        // 1> 获取可变的属性文本
        let attrString = NSMutableAttributedString(attributedString: attributedText)
        attrString.replaceCharactersInRange(selectedRange, withAttributedString: imageText)
        
        // 5.使用可变属性文本替换文本视图的内容
        //   1) 记录光标位置
        let range = selectedRange
        //   2) 设置内容
        attributedText = attrString
        selectedRange = NSRange(location: range.location + 1, length: 0)
    }
    
    func emoticonText() -> String {

        let attrString = attributedText
        
        var strM = String()
        attrString.enumerateAttributesInRange(NSMakeRange(0, attrString.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (dict, range, _) -> Void in
            
            if let attachment = dict["NSAttachment"] as? EmoticonAttachment {
                strM += attachment.chs!
            } else {

                let str = (attrString.string as NSString).substringWithRange(range)
                strM += str
            }
        }
        return strM
    }
}